﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using main.sdk.display.object2d;
using main.sdk.utils;
using main.sdk.utils.animations2D;

namespace main.sdk.utils.animations2D
{
    /**
     * Cria um animator para determinado objeto.
     * 
     * @usage
     *   // Cria um animador usando dado objeto.
     *   Animator2D animator = new Animator2D(object);
     *   
     *   // Cria um animador usando dado objeto.
     *   Animator2D animator = new Animator2D();
     *   animator.Setup(object);
     */
    public class Animator2D : BaseAnimator2D
    {
        #region Variables

        private List<Animation2D>  m_AnimationList = new List<Animation2D>();
        private Animation2D        m_CurrentAnimation = null;
        private Object2D           m_Object = null;

        #endregion

        #region Constructor
        /**
         * Cria o animador.
         * 
         * @param obj - O Objeto da animação.
         */
        public Animator2D(Object2D obj = null)
        {
            m_Object = obj;
            m_CurrentAnimation = null;
        }

        /**
         * Redefine o animador
         * 
         * @param obj - O Objeto da animação.
         */
        public void Setup(Object2D obj = null)
        {
            m_Object = obj;
        }

        #endregion

        #region Methods

        /**
         * Adiciona outra animação.
         */
        public Animator2D Add(Animation2D anim)
        {
            m_AnimationList.Add(anim);
            return this;
        }

        #endregion

        #region Overriden Methods

        /**
         * Verifica se está ativo
         */
        public override bool Active()
        {
            return (m_AnimationList.Count > 0);
        }

        /**
         * Limpa o animador.
         */
        public override void Clear()
        {
            m_AnimationList.Clear();
            m_CurrentAnimation = null;
        }

        /**
         * Atualiza o animador.
         * 
         * @param Time - Tempo que passou
         */
        public override void Update(double Time)
        {
            /* Loop */
            while (true)
            {
                /* Se for inválido os parametros */
                if (m_Object == null)
                    return;
                if (m_AnimationList.Count <= 0)
                    return;

                /* Verifica se a animação é nova */
                if (m_CurrentAnimation != m_AnimationList[0])
                {
                    /* Inicializa a animação */
                    m_CurrentAnimation = m_AnimationList[0];
                    m_CurrentAnimation.Setup(m_Object);
                }
                else
                {
                    /* Salva a animação */
                    m_AnimationList[0].Update(Time);
                }

                /* Removeu a animação. */
                if (m_AnimationList[0].Finished())
                {
                    bool Next = m_AnimationList[0].IsSkip();
                    m_AnimationList.RemoveAt(0);
                    m_CurrentAnimation = null;
                    if (Next)
                        continue;
                }
                break;
            }
        }

        #endregion
    }
}
